/**
 * 工具函数集合
 */

/**
 * 格式化日期
 * @param {Date|string|number} date - 日期对象、日期字符串或时间戳
 * @param {string} format - 格式化模板，如 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} - 格式化后的日期字符串
 */
export const formatDate = (date, format = 'YYYY-MM-DD') => {
  if (!date) return '';
  
  let dt;
  if (date instanceof Date) {
    dt = date;
  } else {
    dt = new Date(date);
  }
  
  if (dt.toString() === 'Invalid Date') return '';
  
  const year = dt.getFullYear();
  const month = dt.getMonth() + 1;
  const day = dt.getDate();
  const hour = dt.getHours();
  const minute = dt.getMinutes();
  const second = dt.getSeconds();
  
  return format
    .replace(/YYYY/g, year.toString())
    .replace(/MM/g, month.toString().padStart(2, '0'))
    .replace(/DD/g, day.toString().padStart(2, '0'))
    .replace(/HH/g, hour.toString().padStart(2, '0'))
    .replace(/mm/g, minute.toString().padStart(2, '0'))
    .replace(/ss/g, second.toString().padStart(2, '0'));
};

/**
 * 格式化金额
 * @param {number|string} amount - 金额数值
 * @param {number} decimals - 小数位数
 * @param {boolean} addSymbol - 是否添加货币符号
 * @returns {string} - 格式化后的金额字符串
 */
export const formatAmount = (amount, decimals = 2, addSymbol = true) => {
  if (amount === undefined || amount === null || amount === '') return '';
  
  const num = parseFloat(amount);
  if (isNaN(num)) return '';
  
  const formatted = num.toFixed(decimals);
  const parts = formatted.split('.');
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  
  return addSymbol ? `¥${parts.join('.')}` : parts.join('.');
};

/**
 * 深拷贝对象
 * @param {Object} obj - 要拷贝的对象
 * @returns {Object} - 拷贝后的新对象
 */
export const deepClone = (obj) => {
  if (obj === null || typeof obj !== 'object') return obj;
  
  try {
    return JSON.parse(JSON.stringify(obj));
  } catch (e) {
    console.error('深拷贝失败:', e);
    return obj;
  }
};

/**
 * 防抖函数
 * @param {Function} fn - 要执行的函数
 * @param {number} delay - 延迟时间（毫秒）
 * @returns {Function} - 防抖处理后的函数
 */
export const debounce = (fn, delay = 300) => {
  let timer = null;
  return function(...args) {
    if (timer) clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, args);
    }, delay);
  };
};

/**
 * 节流函数
 * @param {Function} fn - 要执行的函数
 * @param {number} interval - 间隔时间（毫秒）
 * @returns {Function} - 节流处理后的函数
 */
export const throttle = (fn, interval = 300) => {
  let lastTime = 0;
  return function(...args) {
    const now = Date.now();
    if (now - lastTime >= interval) {
      lastTime = now;
      fn.apply(this, args);
    }
  };
};

/**
 * 获取URL参数
 * @param {string} name - 参数名
 * @param {string} url - URL字符串，默认为当前页面URL
 * @returns {string|null} - 参数值
 */
export const getUrlParam = (name, url) => {
  if (!url) {
    // 在小程序环境中，可以使用getCurrentPages获取当前页面路径
    const pages = getCurrentPages();
    if (pages.length) {
      const currentPage = pages[pages.length - 1];
      url = currentPage.route + '?' + Object.keys(currentPage.options)
        .map(key => `${key}=${currentPage.options[key]}`)
        .join('&');
    } else {
      return null;
    }
  }
  
  const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
  const r = url.split('?')[1]?.match(reg);
  if (r != null) return decodeURIComponent(r[2]);
  return null;
};

/**
 * 生成UUID
 * @returns {string} - UUID字符串
 */
export const generateUUID = () => {
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    const r = Math.random() * 16 | 0;
    const v = c === 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
};

/**
 * 检查网络状态
 * @returns {Promise<boolean>} - 网络是否可用
 */
export const checkNetworkStatus = () => {
  return new Promise((resolve) => {
    uni.getNetworkType({
      success: (res) => {
        resolve(res.networkType !== 'none');
      },
      fail: () => {
        resolve(false);
      }
    });
  });
};

/**
 * 解析逾期天数范围
 * @param {string} rangeStr - 范围字符串，如 '0-7', '8-30', '31-90', '90+'
 * @returns {Object} - 包含min和max的对象
 */
export const parseOverdueDaysRange = (rangeStr) => {
  if (!rangeStr) return { min: 0, max: Infinity };
  
  if (rangeStr.endsWith('+')) {
    const min = parseInt(rangeStr.replace('+', ''));
    return { min, max: Infinity };
  }
  
  const [min, max] = rangeStr.split('-').map(Number);
  return { min, max };
};

/**
 * 解析金额范围
 * @param {string} rangeStr - 范围字符串，如 '0-1000', '1000-5000', '5000-10000', '10000+'
 * @returns {Object} - 包含min和max的对象
 */
export const parseAmountRange = (rangeStr) => {
  if (!rangeStr) return { min: 0, max: Infinity };
  
  if (rangeStr.endsWith('+')) {
    const min = parseInt(rangeStr.replace('+', ''));
    return { min, max: Infinity };
  }
  
  const [min, max] = rangeStr.split('-').map(Number);
  return { min, max };
};